package thread;

/** date: 2023-2-13
 * 饿汉模式的 单例模式 实现
 * 此处保证 Singleton 这个类只能创建出一个实例
 */
class Singleton { /** 类加载阶段，就把实例创建出来了 */
    /* 1、static的目的？
    *   static 为了保证这个实例唯一；保证这个实例在一定时机被创建出来
    *  2、如何保证实例唯一？
    *   1）static 这个操作，是让当前 instance 属性是类属性。类属性是长在类对象上的，类对象又是唯一实例的（只是在类加载阶段被创建出一个实例）
    *   2）构造方法是设为 private，外面的代码无法 new
    * */
    // 在此处，先把这个实例创建出来
    private static Singleton instance = new Singleton();

    // 如果需要使用这个唯一实例，统一通过 Singleton.getInstance() 方式来获取
    public static Singleton getInstance() {
        return instance;
    }

    // 为了避免 Singleton 类不小心复制出多份来
    // 把 构造方法 设为 private，在类外面，就无法通过 new 的方式来创建这个 Singleton 实例了
    private Singleton(){}
}
public class ThreadDemo19 {
    public static void main(String[] args) {
        Singleton s = Singleton.getInstance();
//        Singleton s1 = new Singleton(); 不可以 new
        Singleton s2 = Singleton.getInstance();
        System.out.println(s == s2);
    }
}
